package cn.seaboot.admin.user.dao;

import cn.seaboot.admin.user.bean.UserDept;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * DAO
 *
 * @author Mr.css
 */
@Repository
public interface UserDeptDao {
    /**
     * 增
     *
     * @param userGroup pojo
     * @return affected rows
     */
    int insert(UserDept userGroup);

    /**
     * 按照ID删除
     *
     * @param id    id
     * @param orgId 机构ID
     * @return affected rows
     */
    int deleteById(String orgId, String id);

    /**
     * 改
     *
     * @param userGroup pojo
     * @return affected rows
     */
    int updateSampleById(UserDept userGroup);

    /**
     * 查
     *
     * @param id    id
     * @param orgId 机构ID
     * @return pojo
     */
    UserDept selectById(String orgId, String id);

    /**
     * 查询全部
     *
     * @param params 机构ID
     * @return list
     */
    List<UserDept> selectList(Map<String, Object> params);

    /**
     * 查询子级的数量
     *
     * @param pid   id
     * @param orgId 机构ID
     * @return affected rows
     */
    int selectChildrenCnt(String orgId, String pid);

    /**
     * 查询子级的最大路径值
     *
     * @param orgId 机构ID
     * @param pid   父级ID
     * @return path
     */
    String selectMaxChildrenPath(String orgId, String pid);

    // authority ------------------------------------------------------------------------------------------

    /**
     * 列表查询 - 全量查询
     *
     * @param orgId 机构ID
     * @return list
     */
    List<UserDept> selectFully(String orgId);

    /**
     * 列表查询 - 下级（无递归）
     *
     * @param orgId 机构ID
     * @param pid  分组编码
     * @return pojo
     */
    List<UserDept> selectChildren(String orgId, String pid);

    /**
     * 列表查询 - 下级（无递归）
     *
     * @param orgId 机构ID
     * @param pid  分组编码
     * @return pojo
     */
    Set<String> selectChildrenIds(String orgId, String pid);

    /**
     * 列表查询 - 子孙级（不包含自身）
     *
     * @param orgId 机构ID
     * @param path  分组编码
     * @return pojo
     */
    List<UserDept> selectDescendant(String orgId, String path);

    /**
     * 列表查询 - 子孙级（不包含自身）
     *
     * @param orgId 机构ID
     * @param path  分组编码
     * @return pojo
     */
    Set<String> selectDescendantIds(String orgId, String path);

    /**
     * 列表查询 - 自身节点和子孙级
     *
     * @param orgId 机构ID
     * @param path  分组编码
     * @return pojo
     */
    List<UserDept> selectNode(String orgId, String path);

    /**
     * 列表查询 - 自身节点和子孙级
     *
     * @param orgId 机构ID
     * @param path  分组编码
     * @return pojo
     */
    Set<String> selectNodeIds(String orgId, String path);

    /**
     * 查询上级用户
     *
     * @param orgId 机构ID
     * @param path  分组编码
     * @return pojo
     */
    List<UserDept> selectAbove(String orgId, String path);
}
